<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // var a = 2
    // if (a) {
    //   var b = 3
    //   let c = 4
    // }
    // console.log(b)
    // console.log(c)
    // function fn() {
      
    // }
    // 块作用域: 非函数大括号限制的空间

    // for (let index = 0; index < 3; index++) {
    //   setTimeout(() => {
    //     console.log(index) // 0 1 2
    //   }, 1000)
    // }

   /*  
   {
      let index = 0
      启动定时器
    }

    {
      let index = 1
      启动定时器
    }

    {
      let index=2
      启动定时器
    } 
    */


    // 变量提升: 变量声明提升   ===> 将变量声明部分提前到作用域的最新执行
    // 函数提升: 函数声明提升   ===> 将函数声明部分提前到作用域的最新执行
    var a

    console.log(a)
    a = 2

    fn()

    function fn() {
      var b
      console.log(b)
      b = 3
    }
    var fn = 123
    


    /* 
    执行函数定义/声明: 创建函数对象, 定义了一个变量, 将函数对象赋值给变量
    执行函数: 找到函数对象, 执行其中包含的所有语句代码

    在所有的数据类型中, 只有函数是可以反复执行, 其它类型的数据是不能执行的
    */
    // new Date() // 在此之前肯定执行过什么代码了?  执行了Date函数的定义
  </script>
</body>
</html>